package utilities;

import java.util.Iterator;
import java.util.StringTokenizer;

import es.ucm.fdi.gaia.ontobridge.OntoBridge;

public class Filtro {
	private boolean _troncales=false;
	private boolean _obligatorias=false;
	private boolean _optativas=false;
	private boolean _libre=false;
	private String _carrera="";
	
	private static Filtro _instance=null;
	
	public static Filtro getInstancia(){
		if(_instance==null){
			_instance=new Filtro();
		}
		return _instance;
	}
	
	/**
	 * Asigna los filtros que se deben aplicar.
	 * 
	 * @param troncales - boolean que indica si se debe aplicar (true) o no (false).
	 * @param obligatorias - boolean que indica si se debe aplicar (true) o no (false).
	 * @param optativas - boolean que indica si se debe aplicar (true) o no (false).
	 * @param libre - boolean que indica si se debe aplicar (true) o no (false).
	 * @param carrera - String correspondiente a la carrera seleccionada.
	 */
	public void setFiltros(boolean troncales,boolean obligatorias,boolean optativas,boolean libre,String carrera){
		_troncales=troncales;
		_obligatorias=obligatorias;
		_optativas=optativas;
		_libre=libre;
		_carrera=carrera;
	}
	
	/**
	 * Filtra el listado de asignaturas y lo devuelve con las asignaturas que 
	 * cumplen el filtro, eliminando el tipo de la asignatura asi como los "_",
	 * junto con los saltos de linea "\n". Esta listo para mostrar.
	 * 
	 * @param dato - String correspondiente al listado de asignaturas.
	 * @return String correspondiente al listado filtrado.
	 */
	public String filtra(String dato){
		
		String datoFiltrado="";
		StringTokenizer subCadsCampos=new StringTokenizer(dato,",");
		while(subCadsCampos.hasMoreTokens()){
			String valor=subCadsCampos.nextToken();
			
			OntoBridge ob = jcolibri.util.OntoBridgeSingleton.getOntoBridge();
			
			Iterator<String> iteratorInstances=ob.listSuperClasses(_carrera, true);
	    	String contenido = iteratorInstances.next().toString();
	    	String nodoLibre = "Oferta_libre_configuracion"+contenido.substring(contenido.lastIndexOf("_"));

			boolean pertenece=ob.isInstanceOf(valor, _carrera) || ob.isInstanceOf(valor, nodoLibre) || valor.substring(0, 2).equals("LB") ;
			
			if(pertenece){
				if((_troncales && _obligatorias && _optativas && _libre) || (!_troncales && !_obligatorias && !_optativas && !_libre)){
					datoFiltrado+=valor.substring(3)+"\n";
				}else{
					if(_troncales && valor.startsWith("TR")){
						datoFiltrado+=valor.substring(3)+"\n";
					}
					if(_obligatorias && valor.startsWith("OB")){
						datoFiltrado+=valor.substring(3)+"\n";
					}
					if(_optativas && (valor.startsWith("OP") || valor.startsWith("SE"))){
						datoFiltrado+=valor.substring(3)+"\n";
					}
					if(_libre && (valor.startsWith("LB") || valor.startsWith("SE"))){
						datoFiltrado+=valor.substring(3)+"\n";
					}
				}
			}
		}
		return datoFiltrado.replace("_", " ");		
	}
	
	/**
	 * Filtra el listado de asignaturas y lo devuelve tal y como 
	 * entra solo con las asignaturas que cumplen el filtro.
	 * 
	 * @param dato - String correspondiente al listado de asignaturas.
	 * @return String correspondiente al listado filtrado.
	 */
	public String filtrado(String dato){
		
		String datoFiltrado="";
		StringTokenizer subCadsCampos=new StringTokenizer(dato,",");
		while(subCadsCampos.hasMoreTokens()){
			String valor=subCadsCampos.nextToken();
			
			OntoBridge ob = jcolibri.util.OntoBridgeSingleton.getOntoBridge();
			
			Iterator<String> iteratorInstances=ob.listSuperClasses(_carrera, true);
	    	String contenido = iteratorInstances.next().toString();
	    	String nodoLibre = "Oferta_libre_configuracion"+contenido.substring(contenido.lastIndexOf("_"));

			boolean pertenece=ob.isInstanceOf(valor, _carrera) || ob.isInstanceOf(valor, nodoLibre) || valor.substring(0, 2).equals("LB") ;
			
			if(pertenece){
				if((_troncales && _obligatorias && _optativas && _libre) || (!_troncales && !_obligatorias && !_optativas && !_libre)){
					datoFiltrado+=valor+",";
				}else{
					if(_troncales && valor.startsWith("TR")){
						datoFiltrado+=valor+",";
					}
					if(_obligatorias && valor.startsWith("OB")){
						datoFiltrado+=valor+",";
					}
					if(_optativas && (valor.startsWith("OP") || valor.startsWith("SE"))){
						datoFiltrado+=valor+",";
					}
					if(_libre && (valor.startsWith("LB") || valor.startsWith("SE"))){
						datoFiltrado+=valor+",";
					}
				}
			}
		}
		return datoFiltrado;		
	}
	
	
	/**
	public static void main(String[] args){
		String valor="" +
				"TR_Algebra," +
				"OB_Logica," +
				"TR_Introduccion_a_la_Programacion," +
				"OP_Introduccion_a_la_Electronica," +
				"LB_Fundamentos_Fisicos_de_la_Informatica," +
				"OB_Calculo," +
				"OP_Matematica_Discreta," +
				"OP_Laboratorio_de_Programacion_1," +
				"LB_Laboratorio_de_Fundamentos_de_Computadores," +
				"TR_Fundamentos_de_Computadores";
		setFiltros(true,true,true,true);
		System.out.println(filtra(valor));
		
		setFiltros(false,false,false,false);
		System.out.println(filtra(valor));
		
		//-----------
		
		setFiltros(true,false,false,false);
		System.out.println(filtra(valor));
		
		setFiltros(false,true,false,false);
		System.out.println(filtra(valor));
		
		setFiltros(false,false,true,false);
		System.out.println(filtra(valor));
		
		setFiltros(false,false,false,true);
		System.out.println(filtra(valor));

		//-----------
		
		setFiltros(true,true,false,false);
		System.out.println(filtra(valor));
		
		setFiltros(true,false,true,false);
		System.out.println(filtra(valor));
		
		setFiltros(true,false,false,true);
		System.out.println(filtra(valor));		

		//-----------		
		
		setFiltros(false,true,true,false);
		System.out.println(filtra(valor));
		
		setFiltros(false,true,false,true);
		System.out.println(filtra(valor));
		
		//-----------
		
		setFiltros(false,false,true,true);
		System.out.println(filtra(valor));
	}
	*/
}
